\chapter{Desarrollo e implementación del sistema}
\label{cha:capCuatro}

\section{Introducci\'on.}  

El presente capítulo realiza una exhaustiva explicación de los algoritmos creados y utilizados en el proyecto, se detalla su funcionamiento, las entradas que recibe, y todas las operaciones elaboradas para lograr los objetivos planteados, entre ellos, el de obtener recomendaciones para un usuario determinado. Adicionalmente, se presentan las herramientas utilizadas en para el desarrollo integral del sistema y la descripción de los conjuntos de datos que sirven para realizar las pruebas del sistema simulando usuarios reales.

\section{Caracter\'isticas del sistema.} 
\label{sec:charactSist}

\subsection{Sistema Base}
\label{sisBase}

Para la realización y adaptación del sistema de recomendación se ha tomado como base el trabajo realizado por Marcos Juayek Ferreira Pinto y Alejandra Scuoteguazza Mintegui de la Universidad de Montevideo Uruguay documentado en \cite{juayek}, en el cual se evalúan los sistemas de recomendación audiovisuales basados en técnicas inteligentes. Para ello proponen un sistema de recomendación de contenidos basado en el algoritmo del sistema AVATAR \cite{fernandez2006avatar}, el mismo que se estudia más adelante en este mismo capítulo. El sistema propuesto en este trabajo constituye una versión avanzada del sistema de Juayek y Scuoteguazza, la cual surge de una modificación en el algoritmo núcleo y la implementación de una serie de nuevos módulos enfocados a contrarrestar los problemas de los sistemas de recomendación que se mencionan en el capítulo \ref{cap:sistemasRecomendacion}. Adicionalmente, en esta tesis se analiza la creación de un sistema híbrido que utiliza el algoritmo original y una propuesta de calificación mediante la técnica de vecinos cercanos \gls{KNNlabel} (K vecinos más cercanos). 

%En las secciones posteriores de este capítulo se explicará el funcionamiento detallado del núcleo del sistema y de los módulos externos desarrollados.

\subsubsection{Modelo del Sistema AVATAR \cite{fernandez2006avatar} }

Como se mencionó en la sección \ref{AvatarSec}, el sistema Avatar es un \gls{SRlabel} de contenidos de TV basado en inferencia semántica, el cual encuentra relaciones entre contenidos buscando secuencias en base a las propiedades de las clases ontologías.  Por ejemplo, el sistema conecta la película ``Rocky'' con el reality show ``El retador'' ya que en los dos casos aparece como actor Silvester Stallone. Las secuencias encontradas, permiten establecer una relación de similaridad semántica entre el contenido a recomendar y las preferencias del usuario que al final es calificada y posibilita obtener un valor para el ítem a recomendar \cite{fernandez2006avatar}.

\subsection{Herramientas de software utilizadas}

\subsubsection{Java}

Para el desarrollo del sistema de recomendación se utilizó el lenguaje de programación orientado a objetos Java\footnote{www.java.com} ya que contiene las librerías necesarias para la manipulación de los estándares utilizados en la Web Semántica y además proporciona amplias facilidades a la hora de la creación y publicación de servicios en la Web. \\

Java es un lenguaje de Programación de propósito general basado en clases, que presenta varias ventajas al estar definido como un lenguaje pensado para que el código escrito y compilado sea independiente del sistema operativo y del dispositivo en el que se ejecute. Además de esto, debido a la gran accesibilidad que  presenta al ser un lenguaje de programación libre, Java se ha convertido en uno de los lenguajes más utilizados para aplicaciones de propósito general, en especial para aplicaciones Cliente-Servidor. Adicionalmente, cabe recalcar la robustez que este lenguaje tiene en cuanto al soporte de la comunidad para el desarrollo de cualquier tipo de aplicación.  

\subsubsection{NetBeans}

NetBeans\footnote{www.netbeans.org} es un \gls{IDElabel} o entorno de desarrollo integrado para varios lenguajes de programación, aunque principalmente se especializa en el lenguaje Java. NetBeans es una herramienta que facilita la gestión de un proyecto, ayudando a organizar los paquetes y archivos, las librerías usadas en el programa, los servicios consumidos, las configuraciones, y además, brinda un soporte integrado para el desarrollo en equipo usando las últimas tecnologías para el control de versiones. Esta herramienta proporciona una plataforma robusta para la ejecución y depuración de un programa, la detección y corrección de errores pre compilación e incorpora además un generador de código para que el desarrollador no pierda tiempo escribiendo códigos comunes como constructores o funciones de Get y Set \footnote{las funciones Get y Set se utilizan para obtener y asignar respectivamente el valor de una propiedad de una clase.}. 

\subsubsection{Apache Jena}

Apache Jena\footnote{jena.apache.org} es un marco de desarrollo open source escrito en Java utilizado para la construcción de aplicaciones de Web Semántica y Linked Data\footnote{Se conoce a Linked Data como un conjunto de datasets relacionados disponibles en la web.}. Está compuesta por diferentes APIs que interactúan entre sí para la procesar los datos \gls{RDFlabel}. Brinda soporte para los estándares publicados por las recomendaciones de la  \gls{W3Clabel} \cite{apacheJena}.\\

Entre sus aplicaciones, Jena integra un motor de inferencia basado en reglas y ontologías para realizar razonamiento semántico usando \gls{OWLlabel} o \gls{RDFSlabel}, además de varios mecanismos para el almacenamiento de tripletas \gls{RDFlabel} ya sea en memoria o en disco \cite{juayek}.

\subsubsection{MySQL}
\label{sub:mysql}

MySQL\footnote{http://www.mysql.com/} es un \gls{DBMSlabel} o sistema gestor de base de datos de propósito general ideal para aplicaciones pequeñas y grandes. Su motor de base de datos es rápido, confiable y fácil de usar, siendo desarrollado y Soportado por Oracle Corporation\footnote{www.oracle.com}.  MySQL es un sistema de software libre que se distribuye bajo la licencia GNU GPL\cite{mySql} que ofrece grandes ventajas en cuanto al uso de recursos de hardware y software, ya que al ser una base de datos relativamente liviana, no necesita una gran cantidad de recursos para su correcto funcionamiento. Dado que este proyecto no se centra en el manejo de una base de datos, sino en los sistemas de recomendación, MySQL se ha utilizado como una herramienta auxiliar liviana y de fácil acceso.

\subsubsection{OMDB API}
\label{sub:omdb}

The \gls{OMDBlabel}\footnote{www.themoviedb.org} es un servicio web gratuito y abierto que recibe como parámetro el identificador de un contenido audiovisual y devuelve información relacionada a sus actores, escritores, directores, título, rating, número de votos, géneros, entre otros; ya sea en formato \gls{XMLlabel} o JSon\footnote{json.org} de acuerdo a cómo se especifique.    

\subsection{Arquitectura del Sistema (Modelo de Programación)}

El sistema de recomendación ha sido desarrollado de forma modular de forma que resulte sencillo organizar el código agrupando las funciones y las clases de acuerdo al papel que desempeñan.  El código entero está divido en seis módulos o paquetes principales. En la figura \ref{fig:diagramaEstructura} se muestra la arquitectura del sistema desde la perspectiva de la programación.

\begin{figure}[ht!]
	\centering
		\includegraphics[width=100mm]{ImagenesTesis/Cap4/diagramaEstructura.png}
	\caption{Arquitectura del Sistema desde la perspectiva de la programación}
	\label{fig:diagramaEstructura}
\end{figure}

\begin{itemize}
	\item \textbf{MySQL.} Es el módulo que se encarga de realizar la conexión y las transacciones con la base de datos del sistema, contiene funciones para crear la conexión con el servidor de bases de datos, crear las tablas necesarias e insertar y leer los datos de los perfiles. Éste modulo interactúa directamente con los módulos de los perfiles de usuarios, estereotipo y el módulo recomendador.
	
	\item \textbf{Jena.} Módulo que se encarga del manejo de la librería \textit{Apache Jena}, permite la manipulación de las ontologías o de los recursos \gls{RDFlabel}, \gls{RDFSlabel} o \gls{OWLlabel}. Realiza las consultas necesarias a las ontologías de perfil de usuario y de programación e interactúa directamente con los módulos de perfiles de usuario, perfiles de estereotipo y con el módulo recomendador.
	
	\item \textbf{Perfiles de Usuario.} Módulo programado para el manejo de los perfiles del usuario. Contiene funciones para la creación y enriquecimiento de las ontologías de prueba para los usuarios y la lectura y escritura de perfiles de usuario en la ontología.
	
	\item \textbf{Perfiles de Estereotipo.} De similar funcionalidad que el módulo de perfiles de usuario, se diferencia en que este módulo se encarga de separar a los usuarios en varios grupos de acuerdo a ciertas consideraciones demográficas, cada uno de estos grupos es llamado un estereotipo. 
	
	\item \textbf{Ontología de Programación.} Este módulo realiza la lectura y escritura de la programación televisiva e interactúa con el módulo recomendador.
	
	\item \textbf{Módulo Recomendador.} Contiene los algoritmos necesarios para realizar la recomendación. Específicamente, es el módulo encargado leer los perfiles de usuario o estereotipo y la programación televisiva, realizar los procedimientos necesarios y emitir una recomendación final destinada a un usuario determinado.
	
	\item \textbf{Servicio de Recomendación.} Este servicio escucha las peticiones de recomendación e inicia el trabajo de los módulos inferiores. Como resultado, éste módulo devolverá un listado con la programación recomendada para un usuario.
	
\end{itemize}

En las secciones posteriores se brindará una explicación profunda de la operación de cada uno de estos módulos así como de las principales funciones involucradas en la obtención de las recomendaciones.

\subsection{Entradas ontológicas.}  
\label{sub:entradas}

Un componente clave del sistema de recomendación semántico está constituido por sus entradas ontológicas, cuya procedencia se define en \cite{fernandez2006avatar}, y que fue implementado por \cite{juayek}. En el presente proyecto, esta implementación experimentó diversas modificaciones que serán explicadas con detalle más adelante en la sección \ref{OntologiasUsadas}.

\subsection{Conjunto de datos.}
\label{sub:MovieLens}

Para la creación de los perfiles de usuarios se utilizó la base de datos libre de MoviLens\cite{MovieLens}, cuyas principales características son:

\begin{itemize}
	\item 6040 usuarios, con un identificador numérico (id) individual en el rango de 1 al 6040.
	\item 3952 películas, con un identificador numérico (id)  individual enumerado entre 1 y 3952.
	\item Contiene los ratings o calificaciones realizadas por cada usuario a determinadas películas.
\end{itemize}

\subsubsection{Usuarios.}
Cada usuario tiene las siguientes características:

\begin{enumerate}
	\item \textbf{Género.} Este campo es denotado por una ``\textbf{M}'' para Masculino y por ``\textbf{F}'' para femenino.
	\item \textbf{Edad.} El campo edad no está representado por un número, sino que está representado por un rango como se muestra en la Tabla \ref{fig:TablaEdadUsuarios}. \\
	
\begin{longtable}{c c }
\hline
\textbf{Representación} & \textbf{Rango} \\
\hline \hline
\endfirsthead
\hline
\textbf{Representación} & \textbf{Rango} \\
   \hline \hline
\endhead
\multicolumn{2}{c}{Sigue en la página siguiente.}
\endfoot
\endlastfoot

    \textbf{1} & Bajo 18 \\
    \textbf{18} & 18-24 \\
    \textbf{25} & 25-34 \\
    \textbf{35} & 35-44 \\
    \textbf{45} & 45-49 \\
    \textbf{50} & 50-55 \\
    \textbf{56} & 56+ \\
    \hline
	\caption{Rango de edad de Usuarios.}
		\label{fig:TablaEdadUsuarios}
\end{longtable}%
	\pagebreak
	\item \textbf{Ocupación.} Este campo tiene 20 variaciones, cada una con una representación numérica, la cual se muestra en la Tabla \ref{fig:TablaOcupacionUsuarios}.
	
	\begin{longtable}{c c }
\hline
    \textbf{Representación} & \textbf{Ocupación} \\
\hline \hline
\endfirsthead
\hline
    \textbf{Representación} & \textbf{Ocupación} \\
   \hline \hline
\endhead
\multicolumn{2}{c}{Sigue en la página siguiente.}
\endfoot
\endlastfoot
    \textbf{1} & Otro o no especificado \\
    \textbf{2} & Profesor \\
    \textbf{3} & Artista \\
    \textbf{4} & Oficinista \\
    \textbf{5} & Universitario \\
    \textbf{6} & Servicio al cliente \\
    \textbf{7} & Doctor \\
    \textbf{8} & Ejecutivo \\
    \textbf{9} & Granjero \\
    \textbf{10} & Estudiante \\
    \textbf{11} & Abogado \\
    \textbf{12} & Programador \\
    \textbf{13} & Retirado \\
    \textbf{14} & Vendedor \\
    \textbf{15} & Científico \\
    \textbf{16} & Autónomo \\
    \textbf{17} & Ingeniero \\
    \textbf{18} & Artesano \\
    \textbf{19} & Desempleado \\
    \textbf{20} & Escritor \\

    \hline
	\caption{Ocupación de usuarios.}
		\label{fig:TablaOcupacionUsuarios}
\end{longtable}%
	
\end{enumerate}

\subsubsection{Películas.}

La información que tiene cada una de las películas es la siguiente:

\begin{enumerate}
	\item \textbf{ID.} Un identificador numérico entre el 1 y el 3952.
	\item \textbf{Título.} Es el nombre de la película según \gls{IMDBlabel}; este campo está en inglés.
	\item \textbf{Género.} Cada película tiene 3 géneros, los mismos son de \gls{IMDBlabel}.
\end{enumerate}

\subsubsection{Ratings.}
La base de datos posee más de un millón de ratings, ya que cada usuario tiene al menos 20 calificaciones realizadas y además, existen usuarios con mas de ochocientas calificaciones. Cada usuario califica una película en un escala entre 1 a 5 estrellas.

\subsection{Ontología en uso.}
\label{OntologiasUsadas}

Como ya se mencionó anteriormente, el proyecto está basado en AVATAR \cite{fernandez2006avatar}. Por esta razón se utilizó el mismo modelo ontológico descrito en \cite{blanco2008flexibleAvatar} \cite{fernandez2006avatar} y \cite{AvatarLpez2010property} , que se explica a continuación:\\

El perfil-ontológico se crea en \gls{OWLlabel} (estándar explicado en la sección \ref{sub:owl}), el cual, es representado por el dominio ontológico mostrado en la figura \ref{fig:ontologia1}.

\begin{figure}[ht!]
	\centering
		\includegraphics[width=0.80\textwidth]{ImagenesTesis/Cap4/ontologia1.png}
		\caption{Ontología utilizada en el proyecto.}
	\label{fig:ontologia1}
\end{figure}

En esta figura (\ref{fig:ontologia1}) se puede observar cada ``Cosa'' (``Thing'' en la ontología), que es la instancia de un programa televisivo, cuya propiedad es créditos (``Credits''), tiene como sub-propiedades Actor, Director, Writer y Year. Por otro lado está \emph{ContentCS} que es la clase que contiene los Géneros, tal cual se muestra en la figura \ref{fig:OntologiaGeneros}.\\

\begin{figure}[ht!]
	\centering
		\includegraphics[width=0.70\textwidth]{ImagenesTesis/Cap4/OntologiaGeneros.png}
		\caption{Clase géneros en la ontología.}
			\label{fig:OntologiaGeneros}
\end{figure}
 
Para entender mejor esta sección y las relaciones que se adquieren con un perfil-ontológico se presenta el ejemplo en la figura \ref{fig:SubsetOntologias}, donde se puede apreciar cada Clase (representada por un cuadrado de color amarillo). Cada clase tiene varias instancias (representadas con un círculo), las cuales están relacionadas entre varias similares. Esta relación puede darse por cualquier propiedad que se tenga en común o por su clase padre (en nuestro caso género). 

\begin{figure}[ht!]
	\centering
		\includegraphics[width=0.75\textwidth]{ImagenesTesis/Cap4/SubsetOntologias.PNG}
	\caption{Conjunto de instancias, propiedades y clases en la ontología \gls{OWLlabel}.\cite{blanco2008flexibleAvatar}}
	\label{fig:SubsetOntologias}
\end{figure}

\subsection{Creación y enriquecimiento del perfil-ontológico.}
\label{sub:creacionOntologia}

Un perfil-ontológico es creado por cada usuario basándose en las películas que haya calificado, es decir, cada película que califique se ingresará en formato de tripleta \gls{OWLlabel} en su perfil. La creación se realiza de la siguiente manera:

\begin{enumerate}
	\item Se obtiene los ratings realizados por el usuario de la base de datos de MovieLens (mencionada en la sección \ref{sub:MovieLens}).  
	\item Con el título de cada película se obtiene el ID desde \gls{IMDBlabel}.
	\item El enriquecimiento semántico se realiza a través del servicio web de \gls{OMDBlabel} (mencionado en la sección \ref{sub:omdb}). La petición se realiza utilizando como parámetro el ID de \gls{IMDBlabel}, obteniendo como valor de retorno del servicio web la información relacionada a: título, géneros, elenco completo, lenguajes, etc. Un ejemplo puede apreciarse en la figura \ref{fig:omdb}.
	
	\begin{figure}[ht!]
		\centering
			\includegraphics{ImagenesTesis/Cap4/omdb.PNG}
		\caption{Ejemplo de Api \gls{OMDBlabel}}
		\label{fig:omdb}
	\end{figure}
	
	\item Una vez todos obtenidos los datos de la película, se ingresa las propiedades deseadas a la ontología.
	\item Para finalizar, el \gls{DOIlabel}\footnote{DOI o grado de interés del usuario sobre la película} que se ve representado como la calificación numérica otorgada por el usuario, se transmite hacia todas las propiedades asociadas mediante un mecanismo de propagación, que finalmente permite otorgar un DOI a cada una de ellas.
	
\end{enumerate}

\section{Modificaciones realizadas.}

Como se mencionó en la sección \ref{otrosModel}, el código originalmente realizado por Juayek y Scuoteguazza en \cite{juayek}, se modificó en este proyecto por motivos de mejora de rendimiento y evaluación. Estas modificaciones serán explicadas a continuación:

\subsection{Cambio Diagrama de Base de datos.}
\label{sub:bd}
Tras un breve análisis, se determinó que la aplicación inicial de la base de datos (utilizando \ref{sub:mysql}), era muy básica, ineficiente y limitada para el manejo de grandes volúmenes de datos. En la figura \ref{fig:diagramaJuayek} se aprecia el modelo inicial, en el que puede observarse que el sistema crea una tabla por cada perfil de usuario que exista con su respectivo ID, y conteniendo únicamente los géneros con su respectivo DOI. 

\begin{figure}[ht!]
	\centering
		\includegraphics[height=8cm]{ImagenesTesis/Cap4/diagramaJuayek.png}
	\caption{Diagrama Entidad Relación utilizado en \cite{juayek}.}
	\label{fig:diagramaJuayek}
\end{figure}


Ocurría comúnmente un error al usar el diagrama de la figura \ref{fig:diagramaJuayek}, este se daba al tener una gran cantidad de usuarios, ya que se creaba una gran cantidad de tablas, lo cual, entorpecía el rendimiento del Sistema, entre otros problemas. \\
En este modelo tampoco existe ninguna relación entre tablas ni entidades, y los datos del usuario no se toman en cuenta.\\

\pagebreak 

Para evitar todos estos problemas, mejorar la eficacia y rendimiento se creó el Modelo de base de datos que se presenta en la figura \ref{fig:DiagramaERenUso}, que contiene en la tabla ``USER'' a todos los usuarios del sistema con su respectivos campos(ID, Género, edad y ocupación), y que se relaciona con cada tabla de género que exista, siendo ésta una relación \emph{una a muchos}; Cada tabla de género (simbolizadas por un cuadrado amarillo ) tiene un ID de usuario con el \gls{DOIlabel} y número de películas vistas por este.

\begin{figure}[ht!] 
	\centering
		\includegraphics[height=8cm]{ImagenesTesis/Cap4/DiagramaERenUso.png}
	\caption{Diagrama Entidad Relación creado en el proyecto actual.}
	\label{fig:DiagramaERenUso}
\end{figure}

Por otro lado se creó una tabla llamada ``Neighborgs'' que se relaciona con ``User''. Esta tabla fue creada para la aplicación del módulo con el algoritmo \gls{KNNlabel} (k-nearest neighbors: Algoritmo de K-vecinos cercanos) que será explicada más adelante en la sección \ref{sub:knn}.

\begin{figure}[ht!]
	\centering
		\includegraphics[width=0.60\textwidth]{ImagenesTesis/Cap4/ejemploWriter.PNG}
	\caption{Ejemplo de exceso de escritores. Fuente: \cite{imdbPoca}.}
	\label{fig:ejemploWriter}
\end{figure}

\subsection{Restricción de datos por rendimiento.}
Al ejecutar el sistema, tanto en la creación de los perfiles como en la predicción, existía un error de \emph{bucle infinito}, el grupo de trabajo percibió que esto ocurría con ciertos programas televisivos que tenían un excesivo número de miembros en su elenco, por ejemplo la figura \ref{fig:ejemploWriter}, presenta a la película ``Pocahontas'' con aparentemente más de veinticinco escritores, sin embargo, tras una observación minuciosa, se puede notar que los escritores son únicamente los tres primeros (denotados por el texto \emph{written by}). Esta singularidad suele ocurrir en casos tales como escritores o directores. Para evitar esto, se ha decidido limitar a un número máximo de instancias de una propiedad, que en nuestro caso  es tres. Esta limitación se implementa en la utilización de la API-OMDB que se explica con detalle en la sección \ref{sub:omdb}.



\subsection{Funciones Genéricas.}

En gran parte del código inicial existía código obsoleto y repetido, en algunas partes se repetía con pequeños cambios como modificaciones sutiles de ciertos parámetros. Con fines de optimizar el código, se creó funciones genéricas que cumplen funciones similares y pueden ser reutilizadas en diferentes contextos.\\

\begin {figure}[H]
	\centering
		\includegraphics[width=0.70\textwidth]{ImagenesTesis/Cap4/CodigoJuayek.PNG}
	\caption{Implementación del código original por \cite{juayek}.}
	\label{fig:CodigoJuayek}
\end{figure}


Un ejemplo de ello se manifiesta en las figuras \ref{fig:CodigoJuayek} y \ref{fig:FuncionGenerica}. Observando que en el código original, mostrado en la figura \ref{fig:CodigoJuayek}, se utiliza una extensa cantidad de líneas de código solamente para obtener el DOI de dos propiedades (recuadro amarillo, actor y director), mientras que, en la figura \ref{fig:FuncionGenerica}, la función genérica ``doiPropierty'' adquiere el mismo resultado con un número muy reducido de líneas de código. De esta manera se puede agregar fácilmente cualquier propiedad extra que sea necesaria, como en el ejemplo mostrado, donde se obtiene el \gls{DOIlabel} de tres propiedades (recuadro amarillo; actor, director y escritor).

\begin{figure}[H]
	\centering
		\includegraphics[width=0.90\textwidth]{ImagenesTesis/Cap4/FuncionGenerica.PNG}
	\caption{Función genérica creada en el proyecto.}
	\label{fig:FuncionGenerica}
\end{figure}

Con motivo de la realizaron de pruebas, se ha creado algoritmos de recomendación genéricos que reciben parámetros exclusivos con el fin de obtener resultados diferentes para poder cumplir con los objetivos planteados. Esto se explicará más detalladamente en el capítulo \ref{cha:capCinco}.

\section{Diseño conceptual y estructura modular del sistema de recomendación semántico.} %% xavier

El sistema de recomendación semántico propuesto en el proyecto está estructurado según se muestra en la figura \ref{arquitecturaTesis}. Este diseño posibilita la generación de una recomendación para un usuario partiendo de un conjunto de ítems dado, y además se incluyen varios módulos adicionales que permiten realizar evaluaciones paramétricas, que se detallan  en el capítulo \ref{cha:capCinco}.

\begin{figure}[H]
	\centering
		\includegraphics[width=1.00\textwidth]{ImagenesTesis/Cap4/arquitecturaTesis.PNG}
		\caption{Arquitectura del Sistema.}
	\label{arquitecturaTesis}
\end{figure}

\subsection{Parámetros de entrada.}

El sistema tiene como parámetros de entrada tres ontologías, las cuales son:
\begin{itemize}
	\item \textbf{User ontology.} Consta del perfil ontológico de cada usuario, explicado en la sección \ref{sub:entradas}.
	\item \textbf{Content ontology.} Esta ontología corresponde a la programación o contenido y consta de un conjunto de ítems expresados de manera semántica. De este conjunto se obtendrá cuáles ítems son los más ``Idóneos'' para cada usuario.
	\item \textbf{Domain ontology.} Corresponde a la estructura en la que se basan las dos ontologías mencionadas anteriormente.
\end{itemize}

Una entrada de naturaleza no-semántica es la base de datos de los usuarios, explicada detalladamente en la sección \ref{sub:bd}.

\subsection{Servicio de recomendación.}
\label{sub:servicioweb}
El servicio de recomendación está dividido en dos partes principales, que constituyen componentes clave del proyecto:

\begin{itemize}
	\item \textbf{Algoritmo núcleo.} Explicado detalladamente en la sección \ref{sec:nucleoSistema}.
	\item \textbf{Módulos complementarios.} La sección \ref{sub:modulos} ofrece un detallado análisis de cada uno de estos elementos.
\end{itemize}

El servicio está creado para la fácil modificación y/o agregación de los componentes, es decir, si se desea excluir un módulo, simplemente se lo ``desactiva'', para que el sistema opere sin esta función.

\subsection{Salida o recomendación.}
La recomendación final consta de una lista ordenada de sugerencias de alternativas de entretenimiento para cada usuario. Esta lista presenta desde los ítems con mayor compatibilidad, hasta aquellos menos relacionados a los intereses del usuario.

\section{Algoritmos de recomendación y núcleo del sistema.}
\label{sec:nucleoSistema} %% johnny

El bloque central del sistema es el módulo recomendador, aquí se agrupan las clases y funciones principales para vincular los perfiles de usuario, las programaciones televisivas y generar una recomendación final. En esta sección se explicará el funcionamiento de los algoritmos utilizados.

\subsection{Algoritmo de recomendación semántico por dispersión \cite{juayek}.} 
\label{sub:Dispercion} %Por qué hay dos labels?????
Este algoritmo hace uso de una semántica básica para realizar las recomendaciones sin implementar ninguna clase de inferencia ni búsqueda de conocimiento implícito. Las recomendaciones generadas por el algoritmo se realizan basándose en las propiedades del recurso y el grado de interés de usuario en esas propiedades. Para analizar la operación de este algoritmo, se planteará un ejemplo en el que se desea obtener una valoración para la película ``\emph{Los piratas de caribe, la maldición del perla negra}'' para un usuario determinado. La figura \ref{fig:ontologiaPiratasCaribe} muestra la representación de dicha película en forma de ontología, en la que resulta evidente, que no se trata de una representación formal ya que todas las propiedades de tipo recurso representadas en óvalos, deben estar descritas con una \gls{URIlabel} y no con el nombre directo de la propiedad. Para el ejemplo del funcionamiento del algoritmo, sin embargo, se encontró más oportuno representar los recursos de esta manera.   

\begin{figure}[ht!]
	\centering
		\includegraphics[width=100mm]{ImagenesTesis/Cap4/ontologiaPiratasCaribe.png}
	\caption{Ontología para la película piratas del caribe}
	\label{fig:ontologiaPiratasCaribe}
\end{figure}
      
Para obtener una calificación para esta película, el algoritmo calcula el interés del usuario para cada una de las propiedades semánticas agrupadas por su tipo, es decir, calcula un valor para todos los \emph{actores}, otro para los \emph{directores }y un tercer valor para los \emph{escritores}. Adicionalmente, se calcula el valor del interés del usuario hacia el género de la película, puesto que este recurso es una instancia de la clase del \emph{género}, en este caso de las clases \emph{Acción}, \emph{Aventura }y \emph{Fantasía}. Para encontrar un valor para cada grupo de propiedades semánticas (Actor, Director, Escritor) se calcula el \gls{DOIlabel} de cada recurso según su tipo y se realiza un promedio, es decir, el valor para una propiedad es igual a la suma del \gls{DOIlabel} de cada uno de sus recursos dividida entre el número total de ellos.\\

Para este caso, suponiendo que el usuario tiene especificado en su perfil para el actor \textit{Johnny Deep} un \gls{DOIlabel} de 4.5, para \textit{Geoffrey Rush} un DOI de 3.8, para \textit{Keira Knightley} 4.2 y ningún DOI para Orlando Bloom, entonces, el DOI de la propiedad actor será (4.5+3.8+4.2)/3=4.16. A pesar de que hayan cuatro actores, el algoritmo no promediará recursos que no tengan asignado un DOI.\\

Se realiza entonces un procedimiento similar para las demás propiedades semánticas, concretamente, para directores, escritores y otras propiedades que pueden incluirse en caso de que existan; cada uno de estos valores es sumado y se realiza un segundo promedio para encontrar el \gls{DOIlabel} de la película; por lo tanto, el DOI o grado de interés que calcula el algoritmo para un recurso de Programación televisiva será: 
\begin{equation}
\label{eq:doiPorDisercion}
DOI_t=\frac{\sum_{i=1}^nDOI(P)}{n}
\end{equation}

En donde:

\begin{itemize}
	\item \textbf{n} representa el número de propiedades semánticas del recurso que poseen un valor de DOI
	\item \textbf{P} representa la propiedad semántica $P$.
	\item \textbf{DOI(P)} representa el DOI de la propiedad semántica calculada como en el ejemplo
	\item \textbf{$DOI_t$} representa el DOI total del recurso a calificar. 
\end{itemize}

A la ecuación \ref{eq:doiPorDisercion} se le puede incluir un mecanismo de ponderación o peso para cada propiedad semántica que la convierte en la ecuación \ref{eq:doiPorDisercionPonderado}:

\begin{equation}
	\label{eq:doiPorDisercionPonderado}
	DOI_t=\sum_{i=1}^nDOI(P)W(P)
\end{equation}
 
En donde \textbf{W(P)} representa la ponderación de la propiedad semántica en cuestión. Nótece que en este caso se elimina la división para \textit{n} de la ecuación \ref{eq:doiPorDisercion} puesto que la suma de los pesos de las propiedades semánticas ponderadas debería ser \textit{= 1} (que representa el 100\% del valor de los pesos), es decir que:

\begin{equation}
	\label{eq:sumaDePesos}
	\sum_{i=1}^nW(P)=1
\end{equation}


En el capítulo siguiente se hace un estudio sobre el impacto del uso de las propiedades semánticas en el error de la recomendación al momento de quitarlas o incluirlas en el algoritmo. En la figura \ref{fig:algoritmoDispercion} se muestra el proceso explicado anteriormente en forma de Pseudocódigo, el mismo que se realiza para cada película de la parrilla de programación para obtener una lista ordenada de cada película con su respectiva valoración, al final del proceso se devuelve dicha lista.

\begin{figure}[ht!]
	\centering
		\includegraphics[width=100mm]{ImagenesTesis/Cap4/algoritmoDispercion.PNG}
	\caption{Pseudocódigo del Algoritmo de Recomendación por dispersión.}
	\label{fig:algoritmoDispercion}
\end{figure}

\subsection{Algoritmo de Recomendación con inferencia Semántica \cite{juayek}\cite{AvatarLpez2010property}\cite{avatarSemantics}} 
\label{sub:algoritmoInferencia}

Con una complejidad mayor tanto computacional como lógica, éste algoritmo busca conocimiento implícito encontrando relaciones entre los recursos semánticos que comparten propiedades en común. Con estas relaciones posibilitan la formación de secuencias de recursos para al final, obtener una calificación para el contenido televisivo analizando cada una de las secuencias encontradas. Para ello, el algoritmo realiza una serie de procedimientos que se describen a continuación:

	 \subsubsection{\textbf{Creación de las cadenas de secuencias.}} 
	
	En esta etapa se tratan de encontrar relaciones entre los recursos conectando las propiedades semánticas que comparten entre sí, por ejemplo, en la figura \ref{fig:ontologiaPiratasCaribe} se mostró el modelamiento para la película \textit{``Piratas del caribe, la maldición del perla negra''} y se hizo la suposición de que un usuario en particular mostraba interés hacia el actor \emph{Johnny Deep} en un grado de 4.5 sobre 5. Lo que se trata de hacer a continuación, es encontrar contenidos televisivos que entre sus propiedades semánticas incluyan el recurso ``Johnny Deep'', para seguidamente, crear una cadena con la primera película. Esta tarea no resulta complicada debido a que en la propia descripción del recurso ``Johnny Deep'' se expresan explícitamente los roles que cumple este recurso en otros contenidos televisivos.\\
	
	Para aclarar esta idea, se tomará como referencia la figura \ref{fig:ontologiaPiratasCaribe} que contiene el recurso ``Johnny Deep'', el mismo que se extiende para obtener las conexiones mostradas en la figura \ref{fig:ontologiaJohnnyDeep}. Así, se ha podido relacionar la película ``Los piratas del caribe, la maldición del perla negra'' con las películas ``Rango'' y ``Alicia en el país de las maravillas'' puesto que en todas aparece el recurso ``Johnny Deep'' como actor. Es importante mencionar que no solo se pueden conectar recursos de tipo película o del mismo tipo entre sí, sino que por ejemplo, se puede conectar la película ``Rocky'' con el reality show ``El Retador'' puesto que en ambos recursos aparece ``Silvester Stallone'' entre sus propiedades.
		
\begin{figure}[ht!]
	\centering
		\includegraphics[width=100mm]{ImagenesTesis/Cap4/ontologiaJohnnyDeep.png}
	\caption{Descripción del recurso ``Johnny Deep''}
	\label{fig:ontologiaJohnnyDeep}
\end{figure}

Como se mencionó anteriormente, la representación de la figura \ref{fig:ontologiaJohnnyDeep} se utiliza exclusivamente a manera de ejemplo, puesto que todos los recursos deben estar identificados con una \gls{URIlabel}. La figura \ref{fig:RDFJohnnyDeep} muestra un ejemplo de representación formal en formato \gls{RDFlabel} del recurso ``Johnny Deep'' en donde se observa claramente el uso de las \gls{URIlabel} para identificar al recurso y a todas las propiedades de tipo recurso.

\begin{figure}[ht!]
	\centering
		\includegraphics[width=125mm]{ImagenesTesis/Cap4/RDFJohnnyDeep.PNG}
	\caption{Representación RDF del recurso ``Johnny Deep''}
	\label{fig:RDFJohnnyDeep}
\end{figure}

Siguiendo este principio, el algoritmo crea cadenas de conexiones (también llamadas secuencias) para relacionar varios contenidos entre sí, aunque es importante mencionar que a pesar de que dos conceptos estén relacionados, el algoritmo sólo incluirá en las secuencias aquellos conceptos que sean de interés para el usuario, para esto, la primera conexión considera únicamente los conceptos que tengan expresado un \gls{DOIlabel} superior a 3 en el perfil del usuario en cuestión, puesto que este número representa más de la mitad de la valoración en el rango de calificaciones (1-5); a partir de la primera conexión se incluye sólo a los recursos que tengan un \gls{DOIlabel} superior al recurso anterior en la secuencia. Para explicar esto siguiendo el ejemplo anterior enfocado a la película ``Piratas del caribe, la maldición del perla negra'', se tiene que al crear las primeras conexiones en la secuencia, el algoritmo contempla únicamente a los recursos que tengan un DOI mayor que 3 en el perfil del usuario, así por ejemplo, el recurso ``Orlando Bloom'' será descartado. En la figura \ref{fig:secuenciasPasoUno} se observa la primera conexión entre el recurso y sus propiedades, donde puede notarse que para el ejemplo mencionado, solo se ha tomado en cuenta las propiedades de tipo ``Actor'', aunque de hecho, el algoritmo realiza esto con todos los tipos de propiedades (Escritor, Director, Etc.)\\

\begin{figure}[ht!]
	\centering
		\includegraphics[width=80mm]{ImagenesTesis/Cap4/secuenciasPasoUno.png}
	\caption{Primera cadena de conexiones}
	\label{fig:secuenciasPasoUno}
\end{figure}

En una segunda etapa, el algoritmo busca recursivamente conexiones con más recursos con propiedades comunes, sin embargo, como se mencionó, éste agrega a la secuencia solo los conceptos que tengan un \gls{DOIlabel} superior al anterior. Así, suponiendo que la película ``Alicia en el país de las maravillas'' tiene un DOI de 5 para el usuario, mientras que la película ``Rango'' un DOI de 4, lo que resulta es que en la secuencia se agregará unicamente la primera película. Después de la segunda iteración la secuencia quedará como se muestra en la figura \ref{fig:secuenciaPasoDos}. 

\begin{figure}[H]
	\centering
		\includegraphics[width=120mm]{ImagenesTesis/Cap4/secuenciaPasoDos.png}
	\caption{Segunda cadena de conexiones, con el actor Johnny Deep}
	\label{fig:secuenciaPasoDos}
\end{figure}

Puesto que el procedimiento es recursivo, la segunda iteración completa se muestra en la figura \ref{fig:secuenciasPasoDosCompleto}; para el caso del ejemplo se ha creado una conexión con un solo contenido aunque en la realidad no necesariamente debe ocurrir esto, se crearán tantas conexiones como sea posible siempre y cuando el DOI del recurso sea mayor que el anterior.\\

\begin{figure}[htb!]
	\centering
		\includegraphics[width=120mm]{ImagenesTesis/Cap4/secuenciasPasoDosCompleto.png}
	\caption{Creación de la secuencia en la segunda iteración}
	\label{fig:secuenciasPasoDosCompleto}
\end{figure}

Otro aspecto de vital importancia en el algoritmo es que un recurso no puede aparecer más de una vez en la secuencia. Por ejemplo, la película \textit{``Los piratas del caribe, el cofre de la muerte''} cuenta con los mismos tres actores mencionados anteriormente en su elenco, por lo que se podrían crear conexiones a tres instancias de la misma película que a su vez volverían a conectar a los actores, creándose de esta manera un ciclo infinito de conexiones. Para controlar que esto no suceda, antes de agregar un recurso a la secuencia, el algoritmo la recorre por completo verificando que el recurso no haya sido agregado antes y en caso de ser así, simplemente lo descarta, de esta manera se asegura que no se creen ciclos de conexiones, por lo tanto la película ``Los piratas del caribe, el cofre de la muerte'' se conectará solo una vez con el recurso ``Johnny Deep'' (por ser el primero en ser analizado) y será descartada en las siguientes apariciones, ya sea mediante los Actores, Directores, Escritores o en general, a través de cualquier otra propiedad.\\

La adición de recursos a la secuencia terminará cuando ya no hayan nuevos conceptos para agregar o simplemente cuando se llegue a un límite de profundidad pre-establecido.  Este límite es conocido como \textit{\textbf{path}}. Al finalizar el proceso recursivo, se tendrá una secuencia de conexiones parecida a la que se muestra en la figura \ref{fig:secuenciasFinal}. Se puede notar que las posiciones impares ($1,3,5,..,2n+1$) siempre se encontrarán recursos de tipo contenido televisivo (películas, novelas, series), mientras que las posiciones pares($2,4,6,..,2n$) tendrán recursos de tipo propiedad (Actores, Directores, Escritores). Este es un aspecto muy relevante para el siguiente paso del algoritmo, en donde se aislarán las secuencias individualmente para encontrar su longitud. La longitud de las secuencias será más grande mientras más conceptos nuevos aparezcan o mientras no se haya alcanzado el path pre-establecido.\\

\begin{figure}[ht!]
	\centering
		\includegraphics[width=120mm]{ImagenesTesis/Cap4/secuenciasFinal.png}
	\caption{Ejemplo de secuencias de un contenido televisivo}
	\label{fig:secuenciasFinal}
\end{figure}
 
\subsubsection{\textbf{Búsqueda de relaciones rho-path}.}

Una vez que se tenga la cadena de secuencias completa, el siguiente paso es encontrar todas las relaciones \emph{rho-path} existentes; dos recursos semánticos tienen una relación \emph{rho-path} cuando es posible establecer por lo menos un camino que los conecte \cite{juayek}. Del ejemplo citado a lo largo de esta sección se puede establecer que la película ``Los piratas del caribe, la maldición del perla negra'' tiene una relación \emph{rho-path} con la película ``Alicia en el país de las maravillas'' puesto que se las puede conectar mediante el actor ``Johnny Deep''. Para encontrar todas las relaciones \emph{rho-path}, se descompone la cadena de secuencias en secuencias individuales como se muestra en la figura \ref{fig:secuenciasSeparadas}, la cual representa la descomposición de las secuencias de la figura \ref{fig:secuenciasPasoDosCompleto}.

\begin{figure}[ht!]
	\centering
		\includegraphics[width=80mm]{ImagenesTesis/Cap4/secuenciasSeparadas.png}
	\caption{Descomposición individual de secuencias }
	\label{fig:secuenciasSeparadas}
\end{figure}

A continuación se crean nuevas secuencias incluyendo únicamente a los recursos de tipo programación televisiva. En la figura \ref{fig:RelacionesRhopath} se observa las secuencias creadas, cada una de ellas es conocida como una relación \emph{rho-path}; en el ejemplo, la longitud de la relación es de dos, pero la longitud y el número de relaciones varía dependiendo de la longitud de las secuencias originales. Suponiendo que se ha creado una relación adicional entre la película ``Alicia en el país de las maravillas'' y la serie televisiva ``En terapia'', puesto que ambos recursos comparten a la actriz ``Mia Wasikowska'', para esta secuencia se crearán dos relaciones \emph{rho-path}: una entre las películas ``Los piratas del Caribe'' y  ``Alicia en el país de las maravillas'' cuya longitud es de dos y una segunda relación entre la película ``Los piratas del caribe'' y la serie televisiva ``En terapia'' cuya longitud es de tres. En conclusión, se creará una relación \emph{rho-path} para cada par de recursos de programación televisiva conectados entre sí mediante algún camino o \emph{path}. 

\begin{figure}[ht!]
	\centering
		\includegraphics[width=45mm]{ImagenesTesis/Cap4/RelacionesRhopath.png}
	\caption{Relaciones \emph{Rho-Path}}
	\label{fig:RelacionesRhopath}
\end{figure}

\subsubsection{\textbf{Búsqueda de relaciones \emph{rho-join}}} 
Existe una relación \emph{rho-join} entre dos recursos siempre y cuando los dos sean instancias de la misma clase de unión, por ejemplo, existe una relación \emph{rho-join} de longitud 1 entre todos los recursos que son de tipo película de acción, y una relación \emph{rho-join} de longitud 2 entre todos los contenidos que son de tipo series sin tomar en cuenta su género. Según el modelo de \textsc{avatar}, si dos recursos tienen tanto una relación \emph{rho-join} como una \emph{rho-path} se infiere la relación \emph{rho-path} entre los contenidos en cuestión.     

\subsubsection{\textbf{Cálculo del \gls{DOIlabel} para un recurso de programación televisiva}.} 
El paso final del algoritmo luego de obtenidas todas las relaciones rho-path y rho-join es proceder a valorar el contenido televisivo, para ello se aplica las siguiente fórmula:

\begin{equation}
	\label{eq:doiPorInferencia}
DOI_t=\frac{\sum_{i=1}^nDOI(R_i)/length(R_i)}{\sum_{i=1}^n1/length(R_i)}\cite{juayek}
\end{equation}

En donde:\\
\textbf{\textit{N}} es el número total de relaciones rho-path y rho-join encontradas.\\
\textbf{\textit{DOI($R_i$)}} representa el grado de interés del usuario sobre el último recurso de una relación.\\
\textbf{\textit{length($R_i$)}} representa la longitud de la relación rho-path o rho-join.\\

De esta fórmula se puede interpretar que se realiza un promedio ponderado del DOI de los recursos en el cual, los recursos más alejados o las relaciones más largas son semánticamente menos influyentes que los recursos más próximos al recurso objetivo.


\section{M\'odulos complementarios.} %% ambos
\label{sub:modulos}
Como se explicó en la sección \ref{sub:servicioweb}, el sistema incluye cuatro módulos satélites que incorporan funciones e información adicionales al algoritmo núcleo:

\begin{enumerate}
	\item \textbf{Información de estereotipos:} Stereotypical-based Information.
	\item \textbf{Selector de propiedades semánticas:} Semantic Properties selector.
	\item \textbf{Algoritmo de vecinos cercanos (KNN): }Nearest Neighbor Algorithm.
	\item \textbf{Componentes externos no-semánticos: }External complementary data.
\end{enumerate}

\subsection{Información de Estereotipos} 
\label{sub:estereotipos}

Este módulo intenta resolver los problemas de arranque en frió descritos en la sección \ref{sec:tiposDeSistemas}, para lo cual, se agrupa a los usuarios nuevos o con un número reducido de calificaciones de acuerdo a ciertos factores demográficos o similares a manera de ``Estereotipos'' de tal modo que se pueda generar recomendaciones dirigidas a todos los miembros del grupo basándose en sus características comunes y reales, como por ejemplo su género y edad. Así el algoritmo describe un comportamiento de \emph{filtrado pasivo} como los descritos en la sección \ref{sub:otrosCriterios}.

\subsubsection{División de los estereotipos.}

Para la inclusión de este módulo en el sistema, se han contemplado catorce estereotipos diferentes: un grupo para cada género, y éstos a su vez, se subdividen en siete rangos de edades (menor a 18, 18-24, 25-34, 35-44, 45-49, 50-55, 56+). Este esquema se basa en la suposición que individuos del mismo género y con edades cercanas tienen preferencias televisivas relativamente similares. La división de los grupos de edades se ha hecho basándose en las recomendaciones de agrupación de \emph{MovieLens}\footnote{http://www.movielens.org} descritas en la sección \ref{sub:MovieLens}. 

\subsubsection{Construcción de los Estereotipos.}
Para la construcción de los estereotipos en primer lugar se agrupa a todos los usuarios según a la clasificación a la que corresponda, para esto se recorre el conjunto total de usuarios y, dependiendo del sexo y la edad, se ubica a cada usuario en su grupo correspondiente. Con los grupos ya definidos, se almacena en un archivo los identificadores de los usuarios que pertenecen a cada estereotipo.\\

El siguiente paso es la creación de una ontología para cada estereotipo, para lo cual se adquieren todos los identificadores de los usuarios almacenados en el archivo mencionado anteriormente y que pertenecen al estereotipo analizado con el fin de leer y agrupar las preferencias de todos los usuarios del grupo y unificarlas como si se tratase de un único usuario. La ontología del estereotipo se crea de la misma manera que aquella de un usuario normal, lo cual se describe en la sección \ref{sub:creacionOntologia}.

\subsubsection{Recomendación mediante estereotipos.}
Una recomendación generada utilizando la información de los estereotipos se presenta cuando se trata de un nuevo usuario o cuando éste no ha alcanzado un número mínimo de calificaciones necesarias para estimación de una recomendación personalizada. Con este objetivo en mente, al momento que se requiera una recomendación, el sistema inicialmente verifica que el usuario haya alcanzado el límite antes descrito, de no ser así, se elije el estereotipo en el cual está definido dicho usuario y se procede a realizar la recomendación utilizando cualquiera de los algoritmos descritos en la sección \ref{sec:nucleoSistema}, con la diferencia que no se tomará como entrada del algoritmo la ontología del usuario propiamente, sino la del estereotipo al que pertenece. En el capítulo siguiente se presentará un análisis que permite establecer cuantitativamente el límite mínimo de calificaciones necesario para que un usuario pueda recibir recomendaciones personalizadas.

 
\subsection{Selector de propiedades semánticas} 
\label{sub:selectorPropiedades}

Los contenidos audiovisuales pueden contener tantas propiedades como se desee, sin embargo, el utilizar todas las propiedades disponibles en un \gls{SRSlabel} no necesariamente causará que las predicciones obtenidas sean más precisas e incluso, podrían reflejar una degradación de los resultados. 
Con el objetivo de analizar la influencia de la inclusión de las propiedades semánticas más comunes presentes en este tipo de contenidos en el \gls{SRSlabel}, se propone un módulo que permita realizar una variación de los algoritmos núcleo que permita que cualquier algoritmo sea capaz de recibir como paramentos de entrada un conjunto de propiedades semánticas determinado, así, al éste realizará los cálculos corresponientes considerando únicamente las propiedades ingresadas. Este módulo permite analizar el impacto que causa sobre el error en la estimación de una recomendación, la inclusión o exclusión de propiedades semánticas en el algoritmo. Este estudio será presentado en el capítulo siguiente.\\

\subsection{Algoritmo de vecinos cercanos (KNN).}
\label{sub:knn}
Este módulo se ha concebido con la finalidad de generar una predicción diferente a la del sistema principal y que permita obtener resultados que puedan ser comparados. Su funcionamiento se basa en la utilización de una técnica llamada ``Vecinos Cercanos'' \cite{knn} , que permite encontrar ``usuarios semejantes'' y en consecuencia, perfiles de usuarios con gustos similares.

\begin{figure}[ht!]
	\centering
		\includegraphics[width=0.80\textwidth]{ImagenesTesis/Cap4/knn.png}
	\caption{Ejemplo de KNN.}
	\label{fig:knn}
\end{figure}

Este algoritmo determina un número de usuarios o ``vecinos'' que se encuentren dentro de un rango dado en base a una medida de similaridad. Por ejemplo, se observa que en la figura \ref{fig:knn} el punto rojo ``\textit{U1}'' representa el usuario sobre el cual se desea encontrar los vecinos cercanos. La posición de $U_1$ se fija de acuerdo a sus gustos y preferencias según dos parámetros, que se mapean al plano bi-dimensional en los ejes $x$ y $y$. Un punto cualquiera se le posiciona en el plano de manera que cada eje toma el valor un género de cada usuario, es decir, el eje $x$ puede ser drama y el eje $y$ comedia, entonces un usuario tiene un valor de cada uno de estos géneros, por ejemplo, el usuario $U_1$ tiene aproximadamente 0.6 en el eje $x$ que es drama y un 0.5 en el eje $y$ que es comedia. \\

$U_1$ puede tener vecinos de acuerdo a la distancia que se determine en un inicio, por ejemplo, si se observa la imagen, con una distancia dada $d_1$, el usuario $U_1$ tiene tan solo un vecino que se encuentra en un rango menor a $d_1$. Por otra parte, si se aumenta la distancia a $d_2$, el mismo usuario tiene alrededor de 8 vecinos. Mientras más grande la distancia más vecinos son posibles de encontrar, sin embargo, hay que notar, que el aumentar la distancia ocasionaría que los vecinos sean menos cercanos con respecto a sus gustos y preferencias.\\

Para encontrar la separación entre dos puntos, se utiliza la distancia euclidiana, cuya fórmula para $n-dimensiones$ se describe en la ecuación \ref{eq:eucli}, donde las coordenadas de los puntos son representadas por: $P=(p_1,p_2,..,p_n)$ y $Q=(q_1,q_2,..,q_n)$.

\begin{equation}
	\centering
	\label{eq:eucli}
		$$
		$d_E(P,Q)=\sqrt{(p_1-q_1)^2 + (p_2-q_2)^2 + ... + (p_n-q_n)^2} = \sqrt{ \sum_{i=1}^n 	(p_i-q_i)^2 }$
		$$
	\end{equation}

El módulo implementado permite encontrar vecinos cercanos según los siguientes parámetros:
\begin{enumerate}
	\item \textbf{Distancia euclidiana.} La distancia máxima a buscar vecinos.
	\item \textbf{Número máximo de vecinos.} Es el número máximo de vecinos que puede tener un usuario, específicamente, se obtiene los $n$  más cercanos.
	\item \textbf{Número mínimo de películas.} Se le otorga un número mínimo de películas que el vecino debe haber calificado para ser tomado en cuenta, si no cumple con este requisito se descarta.
\end{enumerate}

Una vez que se han obtenido los vecinos de un usuario, la valoración de un ítem se predice en base a la ejecución del algoritmo núcleo \ref{sec:nucleoSistema} para cada uno de sus vecinos; posteriormente se realiza un promedio de las predicciones de los vecinos para presentarla como la predicción de dicho usuario.

\subsection{Componentes externos no-semánticos.}
Para la incorporación de este módulo, se parte de la premisa de que una predicción obtenida mediante nuestro \gls{SRSlabel},
puede enriquecerse mediante información externa, no necesariamente de naturaleza semántica. Para ello, se plantea mejorar la exactitud de las predicciones generadas por el \gls{SRSlabel} al combinar sus resultados con información externa, la cual está disponible en la web, tal como aquella extraída de \gls{IMDBlabel}\footnote{Internet Movie Data Base: www.imdb.com} o de redes sociales. \\

Por ejemplo, una película catalogada en \gls{IMDBlabel} generalmente tiene una calificación promedio (\emph{average rating}) obtenida de entre las valoraciones otorgadas por miles de usuarios, así, puede asumirse como un indicativo estable y preponderante que potencialmente aportaría positivamente a la precisión del sistema de recomendación, razón por la cual, ha sido considerada en la versión presente del sistema.\\ 

Se estima que una futura versión del sistema, debe incluir un enriquecimiento de perfiles de usuario por medio de las redes sociales (Facebook\footnote{www.facebook.com}, Twitter\footnote{www.twitter.com}, etc.), para incluir información adicional de carácter explícito en las ontologías de usuario, tal como gustos sobre los actores, escritores, etc, que puede ponderarse con un peso mayor en la estimación de las predicciones dada su condición de información explícita provista por el usuario.

